//package com.game.web.gateway.balance;
//
//import com.netflix.client.config.IClientConfig;
//import com.netflix.loadbalancer.AbstractLoadBalancerRule;
//import com.netflix.loadbalancer.ILoadBalancer;
//import com.netflix.loadbalancer.Server;
//
//import java.util.List;
//import java.util.concurrent.atomic.AtomicInteger;
//
//public class GameWebGatewayRule extends AbstractLoadBalancerRule {
//
//    private AtomicInteger nextServerCyclicCounter;
//    private static final boolean AVAILABLE_ONLY_SERVERS = true;
//    private static final boolean ALL_SERVERS = false;
//
//
//    public GameWebGatewayRule() {
//        nextServerCyclicCounter = new AtomicInteger(0);
//    }
//
//    public GameWebGatewayRule(ILoadBalancer lb) {
//        this();
//        setLoadBalancer(lb);
//    }
//
//    public Server choose(ILoadBalancer lb, Object key) {
//        if (lb == null) {
//            log.warn("no load balancer");
//            return null;
//        }
//
//        Server server = null;
//        int count = 0;
//        //最多尝试10次，如果都没有找到可用的服务器 就返回null
//        while (server == null && count++ < 10) {
//            List<Server> reachableServers = lb.getReachableServers();
//            List<Server> allServers = lb.getAllServers();
//            int upCount = reachableServers.size();
//            int serverCount = allServers.size();
//
//            if ((upCount == 0) || (serverCount == 0)) {
//                log.warn("No up servers available from load balancer: " + lb);
//                return null;
//            }
//            //1，2，3...... 顺序获取 index
//            int nextServerIndex = incrementAndGetModulo(serverCount);
//            server = allServers.get(nextServerIndex);
//
//            if (server == null) {
//                /* Transient. */
//                Thread.yield();
//                continue;
//            }
//
//            if (server.isAlive() && (server.isReadyToServe())) {
//                return (server);
//            }
//
//            // Next.
//            server = null;
//        }
//
//        if (count >= 10) {
//            log.warn("No available alive servers after 10 tries from load balancer: "
//                    + lb);
//        }
//        return server;
//    }
//
//    /**
//     * nextServerCyclicCounter 初始值为0，modulo 为所有服务器总数
//     *  next值 为 1，2，3......
//     * 正常情况下 current 和 next 肯定是相等的
//     *
//     * @param modulo The modulo to bound the value of the counter.
//     * @return The next value.
//     */
//    private int incrementAndGetModulo(int modulo) {
//        for (;;) {
//            int current = nextServerCyclicCounter.get();
//            int next = (current + 1) % modulo;
//            if (nextServerCyclicCounter.compareAndSet(current, next))
//                return next;
//        }
//    }
//
//    @Override
//    public Server choose(Object key) {
//        return choose(getLoadBalancer(), key);
//    }
//
//    @Override
//    public void initWithNiwsConfig(IClientConfig clientConfig) {
//    }
//}
//
